package com.ybox.app.controller;


import com.ybox.app.api.domain.AppCollectArticle;
import com.ybox.app.api.domain.req.AppCollectArticleReq;
import com.ybox.app.domain.AppCollect;
import com.ybox.app.domain.AppUserArticle;
import com.ybox.app.domain.example.AppCollectArticleExample;
import com.ybox.app.domain.example.AppCollectExample;
import com.ybox.app.service.AppCollectArticleService;
import com.ybox.app.service.AppCollectService;
import com.ybox.app.service.AppUserArticleService;
import com.ybox.common.core.constant.SecurityConstants;
import com.ybox.common.core.text.ZipUtils;
import com.ybox.common.core.utils.DateUtils;
import com.ybox.common.core.utils.StringUtils;
import com.ybox.common.core.web.controller.BaseController;
import com.ybox.common.core.web.domain.AjaxResult;
import com.ybox.common.core.web.page.TableDataInfo;
import com.ybox.common.log.annotation.Log;
import com.ybox.common.log.enums.BusinessType;
import com.ybox.common.security.annotation.InnerAuth;
import com.ybox.common.security.annotation.RequiresPermissions;
import com.ybox.common.security.utils.SecurityUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 收藏内容(AppCollectArticle)表控制层
 *
 * @author 16554
 * @since 2023-03-23 13:21:56
 */
@RestController
@RequestMapping("/article")
public class AppCollectArticleController extends BaseController {
    /**
     * 服务对象
     */
    @Resource
    private AppCollectArticleService appCollectArticleService;

    @Autowired
    private AppCollectService appCollectService;

    @Autowired
    private AppUserArticleService appUserArticleService;

    private final String[] BOX = {"收集", "所有", "星标", "今天"};

    /**
     * 分页查询
     *
     * @param appCollectArticle 筛选条件
     * @return 查询结果
     */
    @RequiresPermissions("app:article:list")
    @GetMapping
    public TableDataInfo queryByPage(AppCollectArticle appCollectArticle) {
        startPage();
        return getDataTable(null);
    }

    /**
     * 查询全部
     *
     * @param appCollectArticleReq 筛选条件
     * @return 查询结果
     */
    @RequiresPermissions("app:article:query")
    @GetMapping("/list")
    public AjaxResult queryAll(AppCollectArticleReq appCollectArticleReq) {
        AppCollectArticle appCollectArticle = new AppCollectArticle();
        BeanUtils.copyProperties(appCollectArticleReq,appCollectArticle);
        List<AppCollectArticle> appCollectArticles = null;
        // 查询指定collectId值和用户id的结果集
        appCollectArticle.setuId(SecurityUtils.getUserId());
        // 去重后排序
        if (null != appCollectArticle.getCollectTypeIds()){
            appCollectArticle.setCollectTypeIds(Stream.of(appCollectArticle.getCollectTypeIds()).distinct().sorted().toArray(Integer[]::new));
        }
        if (BOX[0].equals(appCollectArticleReq.getName())) {
            // 收集
            appCollectArticles = appCollectArticleService.selectNoneCollectId(appCollectArticle);
        } else if (BOX[1].equals(appCollectArticleReq.getName())) {
            // 所有 啥都不设置
            appCollectArticles = appCollectArticleService.selectCollectArticleList(appCollectArticle);
        }
        else if (BOX[2].equals(appCollectArticleReq.getName())) {
            // 星标
            appCollectArticles = getStarArticles();
        } else if (BOX[3].equals(appCollectArticleReq.getName())) {
            // 今天
            appCollectArticle.setCreateTime(DateUtils.stringToDate(DateUtils.getDate()));
            appCollectArticles = appCollectArticleService.selectCollectArticleList(appCollectArticle);
        } else {
            // 按要求查询
            appCollectArticles = getArticles(appCollectArticleReq.getName(),appCollectArticle);
        }
        return success(appCollectArticles);
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @RequiresPermissions("app:article:query")
    @GetMapping("/{id}")
    public AjaxResult queryById(@PathVariable("id") String id) {
        return success(this.appCollectArticleService.selectByPrimaryKey(id));
    }

    /**
     * 新增数据
     *
     * @param appCollectArticle 实体
     * @return 新增结果
     */
    @RequiresPermissions("app:article:add")
    @Log(title = "文章管理", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@Validated(AppCollectArticle.insert.class) @RequestBody AppCollectArticle appCollectArticle) {
        // 创建 Example 对象
        return toAjax(appCollectArticleService.insertSelective(appCollectArticle));
    }

    /**
     * 新增数据
     *
     * @param appCollectArticle 实体
     * @return 新增结果
     */
    @InnerAuth
    @Log(title = "文章管理", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult addInner(@Validated(AppCollectArticle.insert.class) @RequestBody AppCollectArticle appCollectArticle) {
        // 创建 Example 对象
        return toAjax(appCollectArticleService.insertSelective(appCollectArticle));
    }


    /**
     * 编辑数据
     *
     * @param appCollectArticle 实体
     * @return 编辑结果
     */
    @RequiresPermissions("app:article:edit")
    @Log(title = "文章管理", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody AppCollectArticle appCollectArticle) {
        appCollectArticle.setuId(SecurityUtils.getUserId());
        return toAjax(appCollectArticleService.updateByPrimaryKeySelective(appCollectArticle));
    }

    /**
     * 删除收藏
     *
     * @param collectIds 收藏ids
     * @return 删除是否成功
     */
    @RequiresPermissions("app:article:remove")
    @Log(title = "文章管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{collectIds}")
    public AjaxResult remove(@PathVariable String[] collectIds) {
        // 创建 Example 对象
        AppCollectArticleExample example = new AppCollectArticleExample();
        // Example对象包含一个static的内部类Criteria，Criteria中的方法用来定义SQL语句where后的查询条件，只能有一个createCriteria
        AppCollectArticleExample.Criteria criteria = example.createCriteria();
        // 选择所有 id in collectIds 的收藏
        criteria.andCollectIdIn(Arrays.asList(collectIds));
        // 执行查询
        return toAjax(appCollectArticleService.deleteByExample(example));
    }

    /**
     * 根据登录用户查询用户标星文章列表
     * @return
     */
    List<AppCollectArticle> getStarArticles(){
        AppUserArticle appUserArticle = new AppUserArticle();
        appUserArticle.setUserId(SecurityUtils.getUserId());
        List<AppUserArticle> appUserArticles = appUserArticleService.selectArticleIdByUserId(appUserArticle.getUserId());
        List<String> ArticleIds = appUserArticles.stream().map(e -> e.getArticleId()).collect(Collectors.toList());
        if (ArticleIds.size() <= 0){
            return null;
        }
        // 创建 Example 对象
        AppCollectArticleExample articleExample = new AppCollectArticleExample();
        // Example对象包含一个static的内部类Criteria，Criteria中的方法用来定义SQL语句where后的查询条件，只能有一个createCriteria
        AppCollectArticleExample.Criteria ArticleCriteria = articleExample.createCriteria();
        articleExample.setDistinct(true);
        ArticleCriteria.andArticleIdIn(ArticleIds);
        return appCollectArticleService.selectByExampleWithBLOBs(articleExample);
    }

    /**
     * 自定义查询文章列表
     * @param name
     * @param appCollectArticle
     * @return
     */
    List<AppCollectArticle> getArticles(String name,AppCollectArticle appCollectArticle){
        // 创建 Example 对象
        AppCollectExample example = new AppCollectExample();
        // Example对象包含一个static的内部类Criteria，Criteria中的方法用来定义SQL语句where后的查询条件，只能有一个createCriteria
        AppCollectExample.Criteria criteria = example.createCriteria();
        example.setDistinct(true);
        // 普通根据collectName查询文章
        criteria.andNameEqualTo(name);
        List<AppCollect> appCollects = appCollectService.selectByExample(example);
        // 设置collectId值
        if (ObjectUtils.isNotEmpty(appCollects)) {
            appCollectArticle.setCollectId(appCollects.get(0).getCollectId());
        }
        return appCollectArticleService.selectCollectArticleList(appCollectArticle);
    }
}

